// 给你一棵以 root 为根的 二叉树 ，请你返回 任意 二叉搜索子树的最大键值和。

// 判断root为根的子树是否为二叉搜索树：left->val < root->val < right_val且它的所有孩子节点都符合要求
int is_BST(struct TreeNode *root, int min_val, int max_val) {
    if (root == NULL) return 1;

    return (min_val < root->val && max_val > root->val) && is_BST(root->left, min_val, root->val) \
    && is_BST(root->right, root->val, max_val);
}

int res = 0;
int tree_sum(struct TreeNode *root) {
    if (root == NULL) return 0;
    int sum = root->val + tree_sum(root->left) + tree_sum(root->right);
    res = fmax(res, sum);   // 在每次递归中顺便更新res
    return sum;
}

int dfs(struct TreeNode *root) {
    if (is_BST(root, INT_MIN, INT_MAX)) {   // 如果是二叉搜索树
        tree_sum(root);
        return ;
    }
    // 如果不是，则继续递归左右子树
    dfs(root->left);
    dfs(root->right);
}

int maxSumBST(struct TreeNode* root){
    res = 0;
    dfs(root);
    return res;
}